#include "light.h"

GPIO_InitTypeDef GPIO_InitStruct;
ADC_InitTypeDef ADC_InitStruct;

void AD_Init(void){//初始化AD
	 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2, ENABLE);//开启ADC2的时钟
	 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//开启GPIOA的时钟
	 RCC_ADCCLKConfig(RCC_PCLK2_Div6);//配置ADC模块工作时钟 72 / 6 = 12MHZ
	 
	 /*配置GPIO口*/
	 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;//模拟输入
	 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4;
	 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	 GPIO_Init(GPIOA, &GPIO_InitStruct);
	 
	 /*在规则组列表第一个位置，写入通道0这个通道*/
	 ADC_RegularChannelConfig(ADC2, ADC_Channel_4, 1, ADC_SampleTime_55Cycles5);

	 /*结构体初始化ADC*/
	 ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;//单次转换
	 ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;//数据右对齐
	 ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//触发方式，不使用外部触发，即软件触发
	 ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;//ADC工作模式为独立模式
	 ADC_InitStruct.ADC_NbrOfChannel = 1;//通道数目
	 ADC_InitStruct.ADC_ScanConvMode = DISABLE;//非扫描
	 ADC_Init(ADC2, &ADC_InitStruct);
	 
	 //开启ADC电源
	 ADC_Cmd(ADC2, ENABLE);
	 
	 /*给ADC校准*/
	 ADC_ResetCalibration(ADC2);//复位校准
	 while(ADC_GetResetCalibrationStatus(ADC2) == SET);//返回ADC2复位校准状态
	 ADC_StartCalibration(ADC2);//开始校准
	 while(ADC_GetCalibrationStatus(ADC2) == SET);//等待校准完成
}
 
uint16_t AD_Getvailue(void){//获取信息
	 ADC_SoftwareStartConvCmd(ADC2, ENABLE);//软件触发转换
	 while(ADC_GetFlagStatus(ADC2, ADC_FLAG_EOC) == RESET);//等待转换完成
	 return ADC_GetConversionValue(ADC2);//读取数据
}

uint8_t length(uint16_t num){
	uint8_t length = 0;
	while(num > 0){
		 num = num / 10;
		 length = length + 1;
	}
	return length;
}

void lux_read(u16* lux)
{
	uint16_t adc2;
	adc2 = AD_Getvailue();
	*lux = (uint32_t)(10240000/(1.1*adc2) - 2500);
}
